package br.com.sgpv2.entity.organograma;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

import br.com.sgpv2.entity.cargos.CargoFuncao;
import br.com.sgpv2.entity.pessoa.Pessoa;
import br.com.sgpv2.entity.pessoa.endereco.Endereco;


/**
* Representa uma entidade Entidade no sistema.
*/


@Entity
@Table(name = "ent_entidade")
@SequenceGenerator(name = "sequenceEntidade", sequenceName = "ent_entidade_ent_id_seq")
public class Entidade implements Serializable{
	
	
	private int id;
	private Integer codigo;
	private String CNPJ;
	private String nome;
	private Endereco endereco;
	private String responsavel;
	private TipoPrevidenciaEnum tipoPrevidenciaEnum;
	private List<Secretaria> secretarias;
	private List<Departamento> departamentos;
	private List<Nivel> niveis;
	private List<CargoFuncao> cargosFuncoes;
	private List<Pessoa> pessoas;
	
	
	/**
	* Recupera o id da entidade.
	*/
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "ent_id", nullable = false)
	public int getId() {
		return id;
	}
	
	/**
	* Configura o id da entidade.
	*/
	public void setId(int id) {
		this.id = id;
	}
	
	/**
	* Recupera o codigo da entidade.
	*/
	@Column(name="ent_codigo")
	public Integer getCodigo() {
		return codigo;
	}
	
	/**
	* Configura o codigo da entidade.
	*/
	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}
	
	/**
	* Recupera o CNPJ da entidade.
	*/
	@Column(name="ent_cnpj")
	public String getCNPJ() {
		return CNPJ;
	}
	
	/**
	* Configura o CNPJ da entidade.
	*/
	public void setCNPJ(String cNPJ) {
		CNPJ = cNPJ;
	}
	
	/**
	* Recupera o nome da entidade.
	*/
	@Column(name="ent_nome")
	public String getNome() {
		return nome;
	}
	
	/**
	* Configura o nome da entidade.
	*/
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	/**
	 * Recupera o endereço da entidade.
	 */
	@OneToOne
	@JoinColumn(name = "end_id")
	@Cascade(value = { org.hibernate.annotations.CascadeType.REMOVE,
			org.hibernate.annotations.CascadeType.ALL })
	public Endereco getEndereco() {
		return endereco;
	}
	
	/**
	 * Configura o endereço da entidade.
	 */
	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}
	
	/**
	 * Recupera o responsavel da entidade.
	 */
	@Column(name="ent_responsavel")
	public String getResponsavel() {
		return responsavel;
	}
	
	/**
	 * Congfigura o responsavel da entidade.
	 */
	public void setResponsavel(String responsavel) {
		this.responsavel = responsavel;
	}
	
	
	/**
	 * Recupera o tipo previdencia da entidade.
	 */
	@Column(name = "ent_tipo_previdencia")
	@Enumerated(EnumType.STRING)
	public TipoPrevidenciaEnum getTipoPrevidenciaEnum() {
		return tipoPrevidenciaEnum;
	}
	
	/**
	 * Configura o tipo previdencia da entidade.
	 */
	public void setTipoPrevidenciaEnum(TipoPrevidenciaEnum tipoPrevidenciaEnum) {
		this.tipoPrevidenciaEnum = tipoPrevidenciaEnum;
	}

	/**
	 * Recupera a lista de secretarias da entidade.
	 */
	@OneToMany(mappedBy = "entidade", cascade = CascadeType.ALL)
	@LazyCollection(LazyCollectionOption.FALSE)
	public List<Secretaria> getSecretarias() {
		return secretarias;
	}

	/**
	 * Configura a lista de secretarias da entidade.
	 */
	public void setSecretarias(List<Secretaria> secretarias) {
		this.secretarias = secretarias;
	}

	/**
	 * Recupera a lista de departamentos da entidade.
	 */
	@OneToMany(mappedBy = "entidade", cascade = CascadeType.ALL)
	@LazyCollection(LazyCollectionOption.FALSE)
	public List<Departamento> getDepartamentos() {
		return departamentos;
	}

	/**
	 * Configura a lista de departamentos da entidade.
	 */
	public void setDepartamentos(List<Departamento> departamentos) {
		this.departamentos = departamentos;
	}

	/**
	 * Recupera a lista de niveis da entidade.
	 */
	@OneToMany(mappedBy = "entidade", cascade = CascadeType.ALL)
	@LazyCollection(LazyCollectionOption.FALSE)
	public List<Nivel> getNiveis() {
		return niveis;
	}

	/**
	 * Configura a lista de niveis da entidade.
	 */
	public void setNiveis(List<Nivel> niveis) {
		this.niveis = niveis;
	}

	/**
	 * Recupera a lista de cargos da entidade.
	 */
	@OneToMany(mappedBy = "entidade", cascade = CascadeType.ALL)
	@LazyCollection(LazyCollectionOption.FALSE)
	public List<CargoFuncao> getCargosFuncoes() {
		return cargosFuncoes;
	}

	/**
	 * Configura a lista de cargos da entidade.
	 */
	public void setCargosFuncoes(List<CargoFuncao> cargosFuncoes) {
		this.cargosFuncoes = cargosFuncoes;
	}

	/**
	 * Recupera a lista de pessoas da entidade.
	 */
	@OneToMany(mappedBy = "entidade", cascade = CascadeType.ALL)
	@LazyCollection(LazyCollectionOption.FALSE)
	public List<Pessoa> getPessoas() {
		return pessoas;
	}

	/**
	 * Configura a lista de pessoas da entidade.
	 */
	public void setPessoas(List<Pessoa> pessoas) {
		this.pessoas = pessoas;
	}
	
	

}
